package com.yinpeng.synthetic;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * 合成类测试
 * */
public class SyntheticTest {

	private int outer;

	public void test(){
		SyntheticTest outer = new SyntheticTest();
		InnterTest inner = new InnterTest();
		System.out.println(inner.inner);
		System.out.println(outer.outer);
	}

	class InnterTest{
		/**
		 * 这种private在通过new的方式是不允许直接调用的
		 * 但是合成类可以解决在当前class中可以调用到private定义的变量
		 * */
		private int inner;

		/**
		 * 私有构造方法，在test()方法中还能new，因为InnterTest这里面会生成一个合成类InnterTest@1.class
		 * */
		private InnterTest(){}

		/**
		 * 如果是合成类的话会自动生成两个构造方法，一个合成方法
		 * access$100
		 * public InnterTest(SyntheticTest outer)
		 * public InnterTest(SyntheticTest outer,SyntheticTest$1 outer1)
		 * */
	}

	public static void main(String[] args) {
		/**
		 * 这里会打印：access$000，合成方法
		 * */
		for(Method method :InnterTest.class.getDeclaredMethods()){
			System.out.println(method.getName());
		}

		/**
		 * 这里会打印出来两个构造函数，但是在InnterTest中我们只定义了一个构造方法
		 * 打印结果：
		 * -------------------------
		 * class test.SyntheticTest
		 * -------------------------
		 * class test.SyntheticTest
		 * class test.SyntheticTest$1
		 * */
		for(Constructor<?> constructor : InnterTest.class.getDeclaredConstructors()){
			System.out.println("-------------------------");
			for(Parameter parameter : constructor.getParameters()){
				System.out.println(parameter.getType());
			}
		}
	}
}
